Transaction Management কি?
Transaction Management হল একটি প্রক্রিয়া যার মাধ্যমে ডাটাবেসে একাধিক অপারেশনকে একটি একক ইউনিট হিসেবে সম্পাদন করা হয়। একটি ট্রানজেকশন সম্পূর্ণ হওয়া পর্যন্ত বা ব্যর্থ হলে সমস্ত অপারেশন রোলব্যাক করা হয়। Spring Framework-এ Transaction Management একটি গুরুত্বপূর্ণ ফিচার, যা ডাটাবেস বা অন্য কোনো রিসোর্সে একাধিক অপারেশনের কার্যকারিতা নিশ্চিত করে।
Spring Boot-এ JPA Transaction Management ডাটাবেসের সাথে কাজ করার সময় ডেটা এক্সেস লেয়ারে সঠিকভাবে টপিক্যাল ট্রানজেকশন পরিচালনা করতে সাহায্য করে। Spring-এ ট্রানজেকশন ম্যানেজমেন্ট সাধারনত @Transactional অ্যানোটেশন ব্যবহার করে করা হয়।
Spring Boot JPA তে Transaction Management
Spring Boot JPA ব্যবহার করে ট্রানজেকশন ম্যানেজমেন্টে আপনাকে মূলত নিম্নলিখিত তিনটি কাজ করতে হবে:
@Transactionalঅ্যানোটেশন ব্যবহার করা: এই অ্যানোটেশনটি ট্রানজেকশন চালানোর জন্য ব্যবহৃত হয়। এটি নিশ্চিত করে যে, একটি মেথডের মধ্যে সমস্ত অপারেশনগুলো একসাথে সফলভাবে শেষ হবে বা কোনো এক অপারেশন ব্যর্থ হলে সবকিছু রোলব্যাক হবে।PlatformTransactionManagerব্যবহৃত হয় ট্রানজেকশন পরিচালনার জন্য, তবে Spring Boot স্বয়ংক্রিয়ভাবে এই কনফিগারেশন সেট করে দেয়।rollbackFor: ট্রানজেকশন রোলব্যাক কন্ডিশন কাস্টমাইজ করার জন্য ব্যবহার করা যায়। এটি নির্দিষ্ট এক্সসেপশনগুলির জন্য রোলব্যাক নির্দেশ করে।
Spring Boot JPA তে Transaction Management উদাহরণ
এখানে একটি উদাহরণ দেখা যাবে যেখানে EmployeeService এ @Transactional অ্যানোটেশন ব্যবহার করে একাধিক ডাটাবেস অপারেশন একটি একক ট্রানজেকশনে সম্পাদিত হবে।
১. Maven ডিপেনডেন্সি যুক্ত করা
প্রথমে, pom.xml ফাইলে Spring Boot JPA ডিপেনডেন্সি যুক্ত করতে হবে:
<dependencies>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- H2 Database for In-memory testing (Use appropriate DB for production) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Test for Unit Tests -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
২. Application.properties কনফিগারেশন
application.properties ফাইলটি ডাটাবেস কনফিগারেশন সেট করার জন্য ব্যবহার করা হয়:
# JPA & Database Configuration
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
৩. Employee Entity তৈরি করা
Employee.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
৪. EmployeeRepository তৈরি করা
EmployeeRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
Employee findByName(String name);
}
৫. EmployeeService তৈরি করা (Transactional ব্যবহার)
এখানে, EmployeeService ক্লাসে @Transactional অ্যানোটেশন ব্যবহার করা হচ্ছে। এর মাধ্যমে saveEmployee() মেথডের মধ্যে দুটি অপারেশন সম্পাদিত হবে একটি একক ট্রানজেকশনে।
EmployeeService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
@Transactional
public Employee saveEmployee(Employee employee) {
// Save Employee data
Employee savedEmployee = employeeRepository.save(employee);
// Simulate another operation that should be part of the same transaction
if (savedEmployee.getName().equals("John Doe")) {
throw new RuntimeException("Simulating an error");
}
return savedEmployee;
}
}
এখানে, saveEmployee() মেথডে প্রথমে একটি Employee অবজেক্ট সেভ করা হচ্ছে। এরপর একটি সিমুলেটেড ত্রুটি (error) সৃষ্টি করা হয়েছে, যা ট্রানজেকশন রোলব্যাক করবে।
৬. EmployeeController তৈরি করা
EmployeeController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping
public Employee createEmployee(@RequestBody Employee employee) {
return employeeService.saveEmployee(employee);
}
}
৭. Spring Boot অ্যাপ্লিকেশন চালানো
Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Transaction Management এর কাজ
@Transactionalঅ্যানোটেশনটি EmployeeService ক্লাসেরsaveEmployee()মেথডে যুক্ত করা হয়েছে। এর মাধ্যমে দুটি অপারেশন একসাথে ট্রানজেকশনে সম্পন্ন হবে। যদি প্রথম অপারেশন সফল হয় এবং দ্বিতীয় অপারেশনে কোনো ত্রুটি ঘটে, তবে পুরো ট্রানজেকশন রোলব্যাক হবে।- যদি
employee.getName().equals("John Doe")শর্তটি মিলে, একটিRuntimeExceptionঘটানো হবে এবং Spring এই টেস্ট ট্রানজেকশন রোলব্যাক করবে, ফলে কোনো ডেটা ডাটাবেসে সেভ হবে না।
Rollback কাস্টমাইজ করা
Spring-এ @Transactional এর মাধ্যমে আপনি rollbackFor ব্যবহার করে নির্দিষ্ট এক্সসেপশন গুলোর জন্য রোলব্যাক কাস্টমাইজ করতে পারেন।
উদাহরণ:
@Transactional(rollbackFor = {RuntimeException.class})
public void saveEmployeeWithRollback(Employee employee) {
// Some logic
if (employee.getName().equals("John Doe")) {
throw new RuntimeException("Simulating an error");
}
}
এখানে, শুধুমাত্র RuntimeException বা তার সাবক্লাসগুলির জন্য রোলব্যাক হবে।
সারাংশ
Transaction Management Spring Boot এবং JPA ব্যবহারের মাধ্যমে ডাটাবেসের একাধিক অপারেশনকে একত্রে পরিচালনা করার জন্য গুরুত্বপূর্ণ। @Transactional অ্যানোটেশন ব্যবহার করে আপনি একটি মেথডের মধ্যে একাধিক অপারেশন সম্পাদন করতে পারেন এবং কোনো একটি অপারেশন ব্যর্থ হলে সবকিছু রোলব্যাক করতে পারেন। Spring Boot এবং JPA-তে টপিক্যাল ট্রানজেকশন পরিচালনার মাধ্যমে ডেটার একত্রিততা এবং সিস্টেমের সঠিক কার্যকারিতা নিশ্চিত করা সম্ভব।
Read more